package com.kmxd.ams.core.util;

import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.collect.Sets;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import org.apache.commons.compress.utils.Lists;
import org.apache.commons.lang3.StringUtils;

/**
 * id 工具
 *
 * @author nickbi
 */
public class IdUtil {
  private static final ObjectMapper MAPPER = new ObjectMapper();
  /**
   * 分割id字符串
   *
   * @param ids 字符串
   * @return id set
   */
  public static Set<Long> split(String ids) {
    if (StringUtils.isBlank(ids)) {
      return Sets.newHashSet();
    }
    return Arrays.stream(ids.split(",")).map(Long::parseLong).collect(Collectors.toSet());
  }

  public static List<Long> splitToList(String ids) {
    if (StringUtils.isBlank(ids)) {
      return Lists.newArrayList();
    }
    return Arrays.stream(ids.split(",")).map(Long::parseLong).collect(Collectors.toList());
  }

  public static <T> List<T> split(String ids, Class<T> clazz) {
    if (StringUtils.isBlank(ids)) {
      return Lists.newArrayList();
    }
    return Arrays.stream(ids.split(","))
        .map(data -> MAPPER.convertValue(data, clazz))
        .collect(Collectors.toList());
  }
  /**
   * 按泛型，分割放回id
   *
   * @param ids id 子字符串
   * @return set
   */
  public static Set<Integer> splitInt(String ids) {
    if (StringUtils.isBlank(ids)) {
      return Sets.newHashSet();
    }
    return Arrays.stream(ids.split(",")).map(Integer::parseInt).collect(Collectors.toSet());
  }

  /**
   * 不够位数的在前面补0，保留num的长度位数字
   *
   * @param code
   * @return
   */
  public static String autoGenCode(String code, int num) {
    code = StrUtil.isNotBlank(code) ? code : "0";
    return autoGenCode(Integer.parseInt(code), num, true);
  }

  public static String autoGenCode(String code, int num, boolean isPlus) {
    code = StrUtil.isNotBlank(code) ? code : "0";
    return autoGenCode(Integer.parseInt(code), num, isPlus);
  }

  /**
   * 不够位数的在前面补0，保留num的长度位数字
   *
   * @param code
   * @param num
   * @return
   */
  public static String autoGenCode(Integer code, int num) {
    code = ObjectUtil.isNotEmpty(code) ? code : 0;
    return autoGenCode(code, num, true);
  }

  /**
   * 流水操作
   *
   * @param code 流水值
   * @param num 补0位数
   * @param isPlus 是否加1
   * @return
   */
  public static String autoGenCode(Integer code, int num, boolean isPlus) {
    String result = "";
    code = ObjectUtil.isNotEmpty(code) ? code : 0;
    // 保留num的位数
    // 0 代表前面补充0
    // num 代表长度为4
    // d 代表参数为正数型
    result = String.format("%0" + num + "d", isPlus ? code + 1 : code);
    return result;
  }

  public static List<Long> splitSortList(String ids) {
    String[] split = ids.split(",");
    List<Long> sortList = Lists.newArrayList();
    for (int i = 0; i < split.length; i++) {
      sortList.add(Long.valueOf(split[i]));
    }
    return sortList;
  }
}
